package net.dopan.pigframe.config.utils;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

/**
 * 算出图片主色值
 * */
public class getMainColor {

    public static String[] getImagePixel(String imgFile)  {
        int R=0;
        int G=0;
        int B=0;
        File file = new File(imgFile);
        List<String> list=new ArrayList<String>();
        BufferedImage bi = null;
        try {
            bi = ImageIO.read(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        int width = bi.getWidth();
        int height = bi.getHeight();
        int sum=width*height;
        int minx = bi.getMinX();
        int miny = bi.getMinY();
        for (int i = minx; i < width; i++) {
            for (int j = miny; j < height; j++) {
                int pixel = bi.getRGB(i, j);
                R=(pixel & 0xff0000) >> 16;
                G=(pixel & 0xff00) >> 8;
                B=(pixel & 0xff);
                list.add(R+"-"+G+"-"+B);
            }
        }
        return getMaxCount(list);
    }

    public static String[] getImagePixel2(File file )  {
        int R=0;
        int G=0;
        int B=0;
       List<String> list=new ArrayList<String>();
        BufferedImage bi = null;
        try {
            bi = ImageIO.read(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        int width = bi.getWidth();
        int height = bi.getHeight();
        int sum=width*height;
        int minx = bi.getMinX();
        int miny = bi.getMinY();
        for (int i = minx; i < width; i++) {
            for (int j = miny; j < height; j++) {
                int pixel = bi.getRGB(i, j);
                R=(pixel & 0xff0000) >> 16;
                G=(pixel & 0xff00) >> 8;
                B=(pixel & 0xff);
                list.add(R+"-"+G+"-"+B);
            }
        }
        return getMaxCount(list);
    }


    /***
     * 失败的循环方法
     * */
//	public static String getMaxCount(List<String> list){
//		String regex;
//		Pattern p;
//		Matcher m;
//		String tmp = "";
//		String tot_str = list.toString();
//		int max_cnt = 0;
//		String max_str = "";
//		for(String str : list) {
//			if (tmp.equals(str)) continue;
//			tmp = str;
//			regex = str;
//			p = Pattern.compile(regex);
//			m = p.matcher(tot_str);
//			int cnt = 0;
//			while(m.find()) {
//				cnt++;
//			}
//			if (cnt > max_cnt) {
//				max_cnt = cnt;
//				max_str = str;
//			}
//		}
//		String  str[] = max_str.split("\\-");
//		if(str.length ==3){
//			return getB16(Integer.parseInt(str[0]),Integer.parseInt(str[1]),Integer.parseInt(str[2]));
//		}
//		 return "";
//	}

    /**
     * 成功的循环方法
     * */
    public static String[] getMaxCount(List<String> s) {
        List<String> list = s;
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String c : list) {
            Integer l = map.get(c);
            if (l == null)
                l = 1;
            else
                l++;
            map.put(c, l);
        }
        String max = null;
        long num = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer temp = entry.getValue();
            if (max == null || temp > num) {
                max = key;
                num = temp;
            }
        }
        String str[] = max.split("\\-");
        String string[] = new String[2];
        if (str.length == 3) {
            string[0] = getB16(Integer.parseInt(str[0]), Integer.parseInt(str[1]),
                    Integer.parseInt(str[2]));
            string[1] = getB16(Integer.parseInt(str[1]), Integer.parseInt(str[2]),
                    Integer.parseInt(str[2]));
            return string;
        }
        return null;
    }


    private static String getB16(int R,int G,int B){
        String[] h=new String[256];
        h[0]="00";h[1]="01";h[2]="02";h[3]="03";h[4]="04";h[5]="05";
        h[6]="06";h[7]="07";h[8]="08";h[9]="09";h[10]="0A";h[11]="0B";
        h[12]="0C";h[13]="0D";h[14]="0E";h[15]="0F";h[16]="10";h[17]="11";
        h[18]="12";h[19]="13";h[20]="14";h[21]="15";h[22]="16";h[23]="17";
        h[24]="18";h[25]="19";h[26]="1A";h[27]="1B";h[28]="1C";h[29]="1D";
        h[30]="1E";h[31]="1F";h[32]="20";h[33]="21";h[34]="22";h[35]="23";
        h[36]="24";h[37]="25";h[38]="26";h[39]="27";h[40]="28";h[41]="29";
        h[42]="2A";h[43]="2B";h[44]="2C";h[45]="2D";h[46]="2E";h[47]="2F";
        h[48]="30";h[49]="31";h[50]="32";h[51]="33";h[52]="34";h[53]="35";
        h[54]="36";h[55]="37";h[56]="38";h[57]="39";h[58]="3A";h[59]="3B";
        h[60]="3C";h[61]="3D";h[62]="3E";h[63]="3F";h[64]="40";h[65]="41";
        h[66]="42";h[67]="43";h[68]="44";h[69]="45";h[70]="46";h[71]="47";
        h[72]="48";h[73]="49";h[74]="4A";h[75]="4B";h[76]="4C";h[77]="4D";
        h[78]="4E";h[79]="4F";h[80]="50";h[81]="51";h[82]="52";h[83]="53";
        h[84]="54";h[85]="55";h[86]="56";h[87]="57";h[88]="58";h[89]="59";
        h[90]="5A";h[91]="5B";h[92]="5C";h[93]="5D";h[94]="5E";h[95]="6F";
        h[96]="60";h[97]="61";h[98]="62";h[99]="63";h[100]="64";h[101]="65";
        h[102]="66";h[103]="67";h[104]="68";h[105]="69";h[106]="6A";h[107]="6B";
        h[108]="6C";h[109]="6D";h[110]="6E";h[111]="6F";h[112]="70";h[113]="71";
        h[114]="72";h[115]="73";h[116]="74";h[117]="75";h[118]="76";h[119]="77";
        h[120]="78";h[121]="79";h[122]="7A";h[123]="7B";h[124]="7C";h[125]="7D";
        h[126]="7E";h[127]="7F";h[128]="80";h[129]="81";h[130]="82";h[131]="83";
        h[132]="84";h[133]="85";h[134]="86";h[135]="87";h[136]="88";h[137]="89";
        h[138]="8A";h[139]="8B";h[140]="8C";h[141]="8D";h[142]="8E";h[143]="8F";
        h[144]="90";h[145]="91";h[146]="92";h[147]="93";h[148]="94";h[149]="95";
        h[150]="96";h[151]="97";h[152]="98";h[153]="99";h[154]="9A";h[155]="9B";
        h[156]="9C";h[157]="9D";h[158]="9E";h[159]="9F";h[160]="A0";h[161]="A1";
        h[162]="A2";h[163]="A3";h[164]="A4";h[165]="A5";h[166]="A6";h[167]="A7";
        h[168]="A8";h[169]="A9";h[170]="AA";h[171]="AB";h[172]="AC";h[173]="AD";
        h[174]="AE";h[175]="AF";h[176]="B0";h[177]="B1";h[178]="B2";h[179]="B3";
        h[180]="B4";h[181]="B5";h[182]="B6";h[183]="B7";h[184]="B8";h[185]="B9";
        h[186]="BA";h[187]="BB";h[188]="BC";h[189]="BD";h[190]="BE";h[191]="BF";
        h[192]="C0";h[193]="C1";h[194]="C2";h[195]="C3";h[196]="C4";h[197]="C5";
        h[198]="C6";h[199]="C7";h[200]="C8";h[201]="C9";h[202]="CA";h[203]="CB";
        h[204]="CC";h[205]="CD";h[206]="CE";h[207]="CF";h[208]="D0";h[209]="D1";
        h[210]="D2";h[211]="D3";h[212]="D4";h[213]="D5";h[214]="D6";h[215]="D7";
        h[216]="D8";h[217]="D9";h[218]="DA";h[219]="DB";h[220]="DC";h[221]="DD";
        h[222]="DE";h[223]="DF";h[224]="E0";h[225]="E1";h[226]="E2";h[227]="E3";
        h[228]="E4";h[229]="E5";h[230]="E6";h[231]="E7";h[232]="E8";h[233]="E9";
        h[234]="EA";h[235]="EB";h[236]="EC";h[237]="ED";h[238]="EE";h[239]="EF";
        h[240]="F0";h[241]="F1";h[242]="F2";h[243]="F3";h[244]="F4";h[245]="F5";
        h[246]="F6";h[247]="F7";h[248]="F8";h[249]="F9";h[250]="FA";h[251]="FB";
        h[252]="FC";h[253]="FD";h[254]="FE";h[255]="FF";
        return "#"+h[R] + h[G] + h[B];
    }


    public static void main(String[] args) {
        String url = "https://activityplatform.oss-cn-hangzhou.aliyuncs.com/20181127/62e0be9bd5a841b0a637f71b392f97c7.jpg";
        byte[] btImg = getImageFromNetByUrl(url);
        if(null != btImg && btImg.length > 0){
            System.out.println("读取到：" + btImg.length + " 字节");
            System.err.println("从该连接获得内容");
        }else{
            System.out.println("没有从该连接获得内容");
        }
//        String strs[] = getImagePixel("https://activityplatform.oss-cn-hangzhou.aliyuncs.com/20181127/62e0be9bd5a841b0a637f71b392f97c7.jpg");
//        for (String str:strs
//             ) {
//            System.err.println(str);
//        }
    }
    /**
     * 将图片写入到磁盘
     * @param img 图片数据流
     * @param fileName 文件保存时的名称
     */
    public static void writeImageToDisk(byte[] img, String fileName){
        try {
            File file = new File("D:\\" + fileName);
            FileOutputStream fops = new FileOutputStream(file);
            fops.write(img);
            fops.flush();
            fops.close();
            System.out.println("图片已经写入到D盘");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static byte[] getImageFromNetByUrl(String strUrl){
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
            byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while( (len=inStream.read(buffer)) != -1 ){
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

    /**
     * 将字节流转换成文件
     * @param filename
     * @param data
     * @throws Exception
     */
    public static void saveFile(String filename,byte [] data)throws Exception{
        if(data != null){
            String filepath ="C:\\" + filename;
            File file  = new File(filepath);
            if(file.exists()){
                file.delete();
            }
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data,0,data.length);
            fos.flush();
            fos.close();
        }
    }
}